package com.cwt_taxi_xa.protocol;

import com.cwt_taxi_xa.constants.MyStatus;
import com.cwt_taxi_xa.model.GpsLocationInfo;
import com.cwt_taxi_xa.util.AppLog;
import com.cwt_taxi_xa.util.ExceptionUtil;
import com.cwt_taxi_xa.util.GPSUtil;
import com.cwt_taxi_xa.util.Tools;

import java.text.SimpleDateFormat;
import java.util.Calendar;


/**
 *
 * 项目名称：Dss_CarCall_Sz
 * 类名称：MeterEncoder
 * 类描述：
 * 创建人：Administrator
 * 创建时间：2016-5-31 上午10:35:47
 * 修改人：Administrator
 * 修改时间：2016-5-31 上午10:35:47
 * 修改备注：
 * @version 1.0
 *
 */
public class MeterEncoder {

	private static final String TAG = "MeterEncoder";

	/**
	 * 进入重车应答
	 * @param result	操作结果
	 * @return
	 */
	public static byte[] answerLoad(String result){
		try {
			int dstPos = 0;
			byte[] data = new byte[10];
			// 操作结果	byte
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, dstPos,1);
			dstPos += 1;
			/**
			 *  定位状态
			 *  bit0:	0：已定位	1：未定位
			 *  bit1:	0：北纬	1：南纬
			 *  bit2:	0：东经	1：西经
			 */
			byte[] state = new byte[1];
			String statebit = "";
			if(!MyStatus.gps){
				statebit = "00000001";
			}else{
				statebit = "00000000";
			}
			state[0] = Tools.BitToByte(statebit);
			System.arraycopy(state, 0, data, dstPos,1);
			dstPos += 1;

			GpsLocationInfo locationInfo = GPSUtil.getInstance().getLocInfo();
			// 纬度	未定位填0
			int lat = 0;
			if(locationInfo!=null){
				if(locationInfo.getLat() != null){
					lat = locationInfo.getLat();
				}
			}
			System.arraycopy(Tools.sortToByte(Tools.int2Bytes(lat, 4)), 0, data, dstPos,4);
			dstPos += 4;
			// 经度	未定位填0
			int lng = 0;
			if(locationInfo!=null){
				if(locationInfo.getLng() != null){
					lng = locationInfo.getLng();
				}
			}
			System.arraycopy(Tools.sortToByte(Tools.int2Bytes(lng, 4)), 0, data, dstPos,4);
			dstPos += 4;
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("00E7",data);
			AppLog.i( "进入重车应答："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 停车收费应答
	 * @param result	操作结果
	 * @param isCall	是否电召
	 * @return
	 */
	public static byte[] answerStopChage(String result, boolean isCall){
		try {
			int dstPos = 0;
			byte[] data = new byte[10];
			// 操作结果	byte
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, dstPos,1);
			dstPos += 1;
			// 是否电召	byte
			//			if(result.equals(SerialConstants.NAK)){
			//				System.arraycopy(Tools.parseHexStr2Byte("00"), 0, data, dstPos,1);
			//				dstPos += 1;
			//			}else{
			if(isCall){
				System.arraycopy(Tools.parseHexStr2Byte("01"), 0, data, dstPos,1);
				dstPos += 1;
			}else{
				System.arraycopy(Tools.parseHexStr2Byte("00"), 0, data, dstPos,1);
				dstPos += 1;
			}
			//			}
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("0030",data);
			AppLog.i( "停车收费应答："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}



	/**
	 * 发送驾驶员从业资格信息
	 * @param companyCode		经营许可证号  BYTE[16]
	 * @param carNumber			车牌号	    BYTE[6]
	 * @param time	                        刷卡时间 	YYYYMMDDHHMM
	 * @param deviceStatus		终端状态         BYTE[2]
	 * @param lockTime			公司锁表时间限制	YYYYMMDDHH	全0表示无限制
	 * @param lockCount			公司运营次数限制   0000表示无限制
	 * @param result			操作结果
	 * @return
	 */
	public static byte[] sendDriverInfoForPower905(String mid, String companyCode, String driverCode,
												   String carNumber, String time, int deviceStatus, String lockTime,
												   String lockCount, String result){
		carNumber.replace("陕", "");
		carNumber.replace("测", "");
		carNumber.replace("灯", "");
		try {
			int dstPos = 0;
			byte[] data = new byte[57];

			//  companyCode		公司代码	BYTE[16]
			byte[] companyByte = Tools.stringToByte(companyCode);
			if(companyByte!=null){
				System.arraycopy(companyByte, 0, data, dstPos, companyByte.length);
			}
			dstPos += 16;
			// deriverCode		从业资格证号	BYTE[19]
			byte[] driverByte = Tools.stringToByte(driverCode);
			if(driverByte!=null){
				System.arraycopy(driverByte, 0, data, dstPos, driverByte.length);
			}
			dstPos += 19;
			// carNumber		车牌号	BYTE[6]
			System.arraycopy(carNumber.getBytes("ASCII"), 0, data, dstPos, 6);
			dstPos += 6;
			// driverValidity	刷卡时间	YYYYMMDDHHMM	BCD[6]
			System.arraycopy(Tools.str2Bcd(time), 0, data, dstPos, 6);
			dstPos += 6;
			// deviceStatus		终端状态	BYTE[2]
			System.arraycopy(Tools.sortToByte(Tools.int2Bytes(deviceStatus, 2)), 0, data, dstPos, 2);
			dstPos += 2;
			// lockTime			公司锁表时间限制	YYYYMMDDHH	全0表示无限制		BCD[5]
			System.arraycopy(Tools.parseHexStr2Byte(lockTime), 0, data, dstPos, 5);//
			//System.arraycopy(Tools.str2Bcd(lockTime), 0, data, dstPos, 5);//
			dstPos += 5;
			// lockTime			公司运营次数限制             	0000表示无限制		BCD[2]
			System.arraycopy(Tools.parseHexStr2Byte(lockCount), 0, data, dstPos, 2);//
			//System.arraycopy(Tools.str2Bcd(lockCount), 0, data, dstPos, 2);//
			dstPos += 2;
			// 操作结果	byte
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, dstPos, 1);
			dstPos += 1;

			//合成DTU协议
			byte[] bytes = getMeterDtuBody(mid,data);
			AppLog.i( "发送驾驶员从业资格信息："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}









	/**
	 * 计价器状态查询指令
	 * @return
	 */
	public static byte[] queryMeterState(){
		try {
			byte[] data = new byte[7];
			String systemdate = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime()); // 获取系统当前时间
			System.arraycopy(Tools.str2Bcd(systemdate), 0, data, 0,7);
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("0000",data);
			AppLog.i( "计价器状态查询指令数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 *	运价参数查询指令
	 * @return
	 */
	public static byte[] queryRateParam(){
		try {
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("0004",null);
			AppLog.i( "运价参数查询指令数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 运价参数设置指令
	 * @param securityCode	安全码
	 * @param params		参数十六进制串
	 * @return
	 */
	public static byte[] setRateParam(byte[] securityCode, String params){
		try {
			int dstPos = 0;
			byte[] data = new byte[16+127];
			System.arraycopy(securityCode, 0, data, dstPos,16);
			dstPos += 16;
			System.arraycopy(Tools.parseHexStr2Byte(params), 0, data, dstPos,127);
			dstPos += 127;

			//合成DTU协议
			byte[] bytes = getMeterDtuBody("0005",data);
			AppLog.i( "运价参数设置指令数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 锁定
	 * @param securityCode	安全码
	 * @return
	 */
	public static byte[] lockMeter(byte[] securityCode){
		try {
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("003B",securityCode);
			AppLog.i( "锁定指令数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 解锁
	 * @param securityCode	安全码
	 * @return
	 */
	public static byte[] unlock(byte[] securityCode){
		try {
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("003D",securityCode);
			AppLog.i( "解锁指令数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 查询交易数据
	 * @param queryCode	计价器交易存储序号
	 * @return
	 */
	public static byte[] queryBusinessData(int queryCode){
		try {
			int dstPos = 0;
			byte[] data = new byte[4];
			System.arraycopy(Tools.sortToByte(Tools.int2Bytes(queryCode, 4)), 0, data, dstPos,4);
			dstPos += 4;
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("003F",data);
			AppLog.i( "查询交易数据指令数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 计价器心跳指令应答数据
	 * @return
	 */
	public static byte[] meterHeartAnswer(){
		try {
			byte[] data = new byte[11];
			int dstPos = 0;
			//虚拟数据--------------------------------------------------------------------后期处理
			System.arraycopy(Tools.parseHexStr2Byte("0000"), 0, data,dstPos,2);
			dstPos+=2;
			//时间限制	BCD[5]	格式为YYYYMMDDhh，全0表示无时间限制
			System.arraycopy(Tools.parseHexStr2Byte("0000000000"), 0, data, dstPos,5);
			dstPos+=5;
			//次数限制	BCD[2]	00表示无限制
			System.arraycopy(Tools.parseHexStr2Byte("0000"), 0, data, dstPos,2);
			dstPos+=2;
			//RFU
			System.arraycopy(Tools.parseHexStr2Byte("0000"), 0, data,dstPos,2);
			byte[] bytes = getMeterDtuBody("00E9",data);
			return bytes;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 固件升级指令
	 * @param identifier 厂商标识
	 * @param hardwareVersionNumber 设备硬件版本号
	 * @param softwareVersionNumber 软件主版本号
	 * @param softwareVersionNumber1 软件次版本号
	 * @return
	 */
	public static byte[] meterUpgrade(String identifier,String hardwareVersionNumber,
									  String softwareVersionNumber1,String softwareVersionNumber2){
		try {
			byte[] data = new byte[4];
			int dstPos = 0;
			System.arraycopy(Tools.str2Bcd(identifier), 0, data,dstPos,1);
			dstPos+=1;
			System.arraycopy(Tools.str2Bcd(hardwareVersionNumber), 0, data,dstPos,1);
			dstPos+=1;
			System.arraycopy(Tools.str2Bcd(softwareVersionNumber1), 0, data,dstPos,1);
			dstPos+=1;
			System.arraycopy(Tools.str2Bcd(softwareVersionNumber2), 0, data,dstPos,1);
			dstPos+=1;
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("00FF",data);
			AppLog.i( "计价器固件升级指令："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 合成整条计价器Dtu协议
	 * @param mid 命令字ID
	 * @param data 55AA数据 区
	 * @param deviceID 设备类型
	 * @return
	 */
	public static byte[] getMeterDtuBody(String mid,byte[] data){
		//合成整条55AA协议
		byte[] databyte = getBody(mid, data,"02");
		//		//处理头域
		//		byte[] headdomainbyte = DTUEncoder.getHeadDomainByte("92",databyte.length);
		//		//处理整个消息
		//		byte[] bytes = DTUEncoder.getDTUBodyByte(headdomainbyte, databyte);
		return databyte;
	}


	/**
	 * 编码55AA数据包
	 * @param mid  命令字
	 * @param databyte 数据区
	 * @param DeviceID 设备类型
	 * @return
	 */
	public static byte[] getBody(String mid, byte[] databyte, String deviceID){
		int dstPos = 0;
		int len = 0;
		if(databyte == null){
			len = 11;
		}else{
			len = 11+databyte.length;
		}

		byte[] bodybyte =  new byte[len];
		try {
			dstPos = 0;
			//起始位
			System.arraycopy(Tools.parseHexStr2Byte("55AA"), 0, bodybyte, dstPos, 2);
			dstPos +=2;
			//包长度
			int blen = 4;
			if(databyte!=null){
				blen = blen+databyte.length;
			}
			System.arraycopy(Tools.sortToByte(Tools.int2Bytes(blen, 2)), 0, bodybyte, dstPos, 2);
			dstPos +=2;
			//设备类型	计价器设备类型为0x02，智能顶灯设备类型为0x05，GPS智能服务终端设备类型时0x00
			System.arraycopy(Tools.parseHexStr2Byte(deviceID), 0, bodybyte, dstPos, 1);
			dstPos +=1;

			//厂商标识
			System.arraycopy(Tools.parseHexStr2Byte("02"), 0, bodybyte, dstPos, 1);
			dstPos +=1;

			//命令字
			System.arraycopy(Tools.parseHexStr2Byte(mid), 0, bodybyte, dstPos, 2);
			dstPos +=2;

			//数据区
			if(databyte!=null){
				System.arraycopy(databyte, 0, bodybyte, dstPos, databyte.length);
				dstPos +=databyte.length;
			}
			int n = 0;
			if(databyte != null){
				n = databyte.length;
			}
			//校验码
			byte[] jyw = Tools.byteOrbyte(Tools.byteTobyte(bodybyte,2, 6+n));
			System.arraycopy(jyw, 0, bodybyte, dstPos, 1);
			dstPos +=1;

			//结束位
			System.arraycopy(Tools.parseHexStr2Byte("55AA"), 0, bodybyte, dstPos, 2);

			// 转义
			bodybyte = Tools.trope55aa(bodybyte, Tools.ENCODER_TYPE);

		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
		}
		return bodybyte;
	}

}
